【Hono】HonoをCDKでAPI Gateway & Lambdaにデプロイする方法

【Hono】HonoをCDKでAPI Gateway & Lambdaにデプロイする方法

この記事では、HonoをAWS CDKを利用してLambdaで実行する方法を解説します。AWS CLIとCDKのインストールから始まり、CDKプロジェクトの初期化、Lambda関数とAPI Gatewayの設定、デプロイ方法までを説明します。
Clock Icon2025.01.07

リテールアプリ共創部の戸田駿太です。

最近話題の Hono を、AWS CDK を利用して Lambda で実行する方法を紹介します。

今回の方法は以下の公式ドキュメントに沿って説明しつつ CDK のセットアップについて補足しています。
https://hono.dev/docs/getting-started/aws-lambda

構成

  • Hono v4
  • CDK v2

Group 3.png

CDK のセットアップ

CDK の環境構築をします。

以下のコマンドから AWS アクセスキー ID、シークレットアクセスキー、デフォルトリージョンを設定します。

参考資料
https://zenn.dev/akkie1030/articles/aws-cli-setup-tutorial

aws configure
aws configure の項目の例

aws configure
AWS Access Key ID []:
AWS Secret Access Key [
]:
Default region name [ap-northeast-1]:
Default output format [None]:

以下のコマンドを実行して CDK のセットアップをします。

mkdir my-app
cd my-app
cdk init app -l typescript
mkdir lambda
touch lambda/index.ts

以下のコードをlib/cdk-stack.tsに記述します。

lib/cdk-stack.ts
import * as cdk from 'aws-cdk-lib'
import { Construct } from 'constructs'
import * as lambda from 'aws-cdk-lib/aws-lambda'
import * as apigw from 'aws-cdk-lib/aws-apigateway'
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'

export class MyAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const fn = new NodejsFunction(this, 'lambda', { //lambdaはlambdaの関数名です
      entry: 'lambda/index.ts', // このpathで実行ファイルを変更できます
      handler: 'handler',
      runtime: lambda.Runtime.NODEJS_20_X,
    })
    fn.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE, // 認証なしに設定
    })
    new apigw.LambdaRestApi(this, 'myapi', {  // myapiはAPI GatewayのAPI名です
      handler: fn,
    })
  }
}

Hono のセットアップ

Hono のインストール

npm i hono

Hono のテストコードを記述

lambda/index.ts
import { Hono } from "hono";
import { handle } from "hono/aws-lambda";

const app = new Hono();

app.get("/", (c) => c.text("Hello Hono!"));

export const handler = handle(app);

実行してみる

cdk でデプロイする

cdk deploy

↓ デプロイの実行結果(一部抜粋)

CdkTestStack: deploying... [1/1]
CdkTestStack: creating CloudFormation changeset...

 ✅  CdkTestStack

✨  Deployment time: 53.42s

Outputs:
CdkTestStack.myapiEndpoint8EB17201 = https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:000000000000:stack/MyAppStack/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

✨  Total time: 56.85s

デプロイすると cloudformation のページからスタックが作成されたことが確認できます。
image.png

実行結果の URL にアクセスすると Hono の実行結果を確認できます。

Outputs:
CdkTestStack.myapiEndpoint8EB17201 = https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/ ←このURL

実行結果(Postman)
image.png

補足

モノリスについて

Lambda で Hono を扱うということは Lambda をモノリス(一つの Lambda)で運用するということなので、そのメリットとデメリットは知っておくべきだと思います。

モノリス運用の参考資料
https://zenn.dev/watany/articles/183d40f8e31a45

公式ではアンチパターンとされていますが上記の記事で解説がされています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/monolith.html

ローカルで実行

ローカルで実行したい方は以下の記事を参考にしてみてください。
https://qiita.com/mkin/items/0640030521cc36835f60

DynamoDB と連携

より実践的にサーバーレスの基本の型である API Gateway - Lambda - DynamoDB を実装する方法を解説している記事です。

https://dev.classmethod.jp/articles/cdk-hono-crud-api-lambda-api-gateway-dynamodb/

まとめ

今回は、Hono を AWS Lambda 上で動作させるための基本的な手順を解説しました。
ぜひ、この記事を参考にして自身のプロジェクトに役立ててください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.